#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
@date: 2011-11-09
@author: shell.xu
'''
import os, sys, datetime
import web
import tmpl
import pymongo
from bson.objectid import ObjectId
from utils import *

articles = web.config.db['articles']
articles.ensure_index('author')

form_add = form.Form(
    form.Hidden('toid'),
    form.Textbox('username', description = 'username'),
    form.Textbox('email', description = 'email'),
    form.Textbox('website', description = 'website'),
    form.Textarea('content', description = 'content'),
    form.Button("submit", type="submit", description="Submit"),
    )

# 注意到此处的toid并没有启用，这主要是因为在网页部分没有人写js代码，为回复到哪个id进行设定
# 因此这部分的回应永远是0，希望将来有人进行js代码编写，并且将评论列表扩展为评论树，以实现盖楼
class add(object):
    ''' 添加一个注释 '''
    def POST(self, aid):
        f = form_add()
        if not f.validates():
            return web.seeother('%s/%s' % (web.config.urls['atc_show'], aid))
        atc = articles.find_one({'_id': ObjectId(aid)})

        # 仔细看，author是将内容复制到评论中的。好处是无需join或者级联搜索，性能很好。
        # 坏处是如果用户的数据更新，评论不会更新。
        if web.config.sess.get('user', None) is None:
            u = form2obj(f, ['email', 'website'], {'_id': 'guest'})
            atc['cmtlist'].append({'id': atc['cmtid'], 'author': u,
                                   'content': f.content.get_value()})
        else:
            u = dictcut(web.config.sess.user, [u'_id', u'email', u'website'])
            atc['cmtlist'].append({'id': atc['cmtid'], 'author': u,
                                   'content': f.content.get_value()})
        atc['cmtid'] += 1
        atc['cntcmt'] = len(atc['cmtlist'])
        # 此处有一点问题，mongo所有修改，都是先检索，再更新。
        # 如果同时两个人更新，则有可能最后执行save的覆盖前者。
        # 目前只有comment可能出现这个问题，article和user修改不大可能出现同时的两个修改。
        articles.save(atc)
        return web.seeother('%s/%s' % (web.config.urls['atc_show'], aid))
